/*******************************************************************************
 * Copyright (c) 2010-2011 Robert Fraser                                       *
 *                                                                             *
 * Permission is hereby granted, free of charge, to any person obtaining a     *
 * copy of this software and associated documentation files (the "Software"),  *
 * to deal in the Software without restriction, including without limitation   *
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,    *
 * and/or sell copies of the Software, and to permit persons to whom the       *
 * Software is furnished to do so, subject to the following conditions:        *
 *                                                                             *
 *   - The above copyright notice and this permission notice shall be included *
 *     in all copies or substantial portions of the Software.                  *
 *                                                                             *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *
 * DEALINGS IN THE SOFTWARE.                                                   *
 *******************************************************************************/

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Markup;
using System.Windows.Media.Imaging;

namespace zeal.ui.util
{
    [MarkupExtensionReturnType(typeof(FrameworkElement))]
    internal sealed class IconExtension : MarkupExtension
    {
        public string text { get; set; }
        public string filename { get; set; }
        public int? width { get; set; }
        public int? height { get; set; }

        public IconExtension() { }
        public IconExtension(string filename) : this() { this.filename = filename; }
        public IconExtension(string filename, string text) : this(filename) { this.text = text; }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            BitmapImage src = AssemblyResources.getPackedBitmap(string.Format("icons/{0}.png", filename));
            Image img = new Image { Width = width ?? src.PixelWidth, Height = height ?? src.PixelHeight, Source = src };
            if (string.IsNullOrWhiteSpace(text))
                return img;
            StackPanel root = new StackPanel { Orientation = Orientation.Horizontal };
            root.Children.Add(img);
            root.Children.Add(new TextBlock { Text = text, Margin = new Thickness(5, 0, 0, 0) });
            return root;
        }
    }

    internal sealed class EnumBindingExtension : Binding
    {
        public EnumBindingExtension(string path, object value)
            : base(path)
        {
            Mode = BindingMode.TwoWay;
            Converter = EnumToBoolConverter.instance;
            ConverterParameter = value;
        }

        private sealed class EnumToBoolConverter : IValueConverter
        {
            public static readonly EnumToBoolConverter instance = new EnumToBoolConverter();
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value.Equals(parameter); }
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return ((bool)value) ? parameter : DependencyProperty.UnsetValue; }
        }
    }
}